package com.marveal.rabbit.common.util;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;

public class HutoolJsonUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(HutoolJsonUtil.class);

    /**
     * 方法名称：将JSON字符串转换为实体对象
     *
     * @param data  JSON字符串
     * @param clazz 转换对象
     * @return T
     */
    public static <T> T convertJSONToObject(String data, Class<T> clazz) {
        check("convertJSONToObject", data, clazz);
        return JSONUtil.toBean(data, clazz);
    }

    /**
     * 方法名称：将JSONObject对象转换为实体对象
     *
     * @param data  JSONObject对象
     * @param clazz 转换对象
     * @return T
     */
    public static <T> T convertJSONToObject(JSONObject data, Class<T> clazz) {
        check("convertJSONToObject", data, clazz);
        return data.toBean(clazz);
    }

    /**
     * 方法名称：将JSON字符串数组转为List集合对象
     *
     * @param data  JSON字符串数组
     * @param clazz 转换对象
     * @return List<T>集合对象
     */
    public static <T> List<T> convertJSONToArray(String data, Class<T> clazz) {
        check("convertJSONToArray", data, clazz);
        JSONArray jsonArray = JSONUtil.parseArray(data);
        check("convertJSONToArray", jsonArray);
        return JSONUtil.toList(jsonArray, clazz);
    }

    /**
     * 方法名称：将List<JSONObject>转为List集合对象
     *
     * @param data  List<JSONObject>
     * @param clazz 转换对象
     * @return List<T>集合对象
     */
    public static <T> List<T> convertJSONToArray(List<JSONObject> data, Class<T> clazz) {
        check("convertJSONToArray", data, clazz);
        List<T> result = new ArrayList<>();
        for (JSONObject jsonObject : data) {
            check("convertJSONToArray", jsonObject);
            result.add(convertJSONToObject(jsonObject, clazz));
        }
        return result;
    }

    /**
     * 方法名称：将对象转为JSON字符串
     *
     * @param obj 任意对象
     * @return JSON字符串
     */
    public static String convertObjectToJSON(Object obj) {
        check("convertObjectToJSON", obj);
        return JSONUtil.toJsonStr(obj);
    }

    /**
     * 方法名称：将对象转为JSONObject对象
     *
     * @param obj 任意对象
     * @return JSONObject对象
     */
    public static JSONObject convertObjectToJSONObject(Object obj) {
        check("convertObjectToJSONObject", obj);
        return JSONUtil.parseObj(obj);
    }


    /**
     * 方法名称：将对象转为JSONObject对象,包括null值
     *
     * @param obj 任意对象
     * @return JSON字符串
     */
    public static String convertObjectToJsonWithNullValue(Object obj) {
        return JSONUtil.parseObj(obj, false).toString();
    }

    // 检测空值
    private static void check(String methodName, Object... dates) {
        for (Object data : dates) {
            if (ObjectUtils.isEmpty(data)) {
                LOGGER.error("#HutoolJsonUtil.{}# {} is empty...", methodName, data.getClass().getName());
            }
        }
    }
}
